trait object
RustのTraitへの参照のこと
fat pointerである
#wip
traitを実装するobjectのpointer
実行時に型が決まる
Dynamic Dispatch
サイズが不定 (?Sized) のため、ポインタ経由で扱う
例
code:rs
let mut buf: Vec<u8> = vec![];
let writer: &mut Write = &mut buf;
ここでの値writerがtrait object
&mut Traitのような型になる
Writeはtraitの1つmrsekut.icon
trait objectはfat pointer
何と何を指している?
値へのpointer
これは普通のpointermrsekut.icon
値の型を表すテーブル(vtable)へのpointer
これのことをvptrと呼ぶっぽい
コンパイル時に、その型用のtraitの実装が紐付けられる
上のコード例で言えば、impl Write for Vec<u8> {..}の実装が紐付けられる
/mrsekut-book-4873118557/258
#??
何が嬉しいのかよくわかっていない
嬉しいと以下嬉しくないとかではなく、そういう構造で実装してますよ、ってだけかもしれない
他の知っている言語へのアナロジーをうまくできていない
/mrsekut-book-4873118557/257にJavaのinterfaceの説明があるがJavaがわからん
たぶんそんな難しいものではなく、身近なものなんだろうなという気はしている
code:ts
interface IWriter {
write(str: string): void
}
class Writer1 implements IWriter {
write(str: string): void {
console.log(str)
}
}
class Writer2 implements IWriter {
write(str: string): void {
console.log(str)
}
}
const w: IWriter = new ????;
w.write('hoge')
こんな風に書いた時の、wと同じ?
w自体は、IWriter型で、interfaceに依存している
実体が、Writer1なのかWriter2なのかは、コンパイル時には決定できない
/mrsekut-book-4873118557/257
https://doc.rust-lang.org/reference/types/trait-object.html
https://doc.rust-jp.rs/book-ja/ch17-02-trait-objects.html